package radio;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;

public class Recomendacao {

	private double multiplicadorSexo;
	private double multiplicadorIdade;
	private double multiplicadorDeHorasDeMusicaPorSemana;
	private double multiplicadorDeRenda;
	private double multiplicadorDasMusicasCompradas;
	private int K;

	public void configurarMultiplicadores(double multiplicadorSexo,
			double multiplicadorIdade,
			double multiplicadorDeHorasDeMusicaPorSemana,
			double multiplicadorDeRenda, double multiplicadorDasMusicasCompradas) {
		this.multiplicadorSexo = multiplicadorSexo;
		this.multiplicadorIdade = multiplicadorIdade;
		this.multiplicadorDeHorasDeMusicaPorSemana = multiplicadorDeHorasDeMusicaPorSemana;
		this.multiplicadorDeRenda = multiplicadorDeRenda;
		this.multiplicadorDasMusicasCompradas = multiplicadorDasMusicasCompradas;
	}

	public Recomendacao() {
		this.setPerfilDeMultiplicadores5();
		this.K = 3;
	}

	public void setDefaultMultiplicadores() {
		this.multiplicadorSexo = 11;
		this.multiplicadorIdade = 11;
		this.multiplicadorDeHorasDeMusicaPorSemana = 11;
		this.multiplicadorDeRenda = 11;
		this.multiplicadorDasMusicasCompradas = 11;
	}

	public void setPerfilDeMultiplicadores1() {
		this.multiplicadorSexo = 12.2;
		this.multiplicadorIdade = 15.4;
		this.multiplicadorDeHorasDeMusicaPorSemana = 11.4;
		this.multiplicadorDeRenda = 10.5;
		this.multiplicadorDasMusicasCompradas = 11.1;
	}

	public void setPerfilDeMultiplicadores2() {
		this.multiplicadorSexo = 18.7;
		this.multiplicadorIdade = 12.4;
		this.multiplicadorDeHorasDeMusicaPorSemana = 14.4;
		this.multiplicadorDeRenda = 10.5;
		this.multiplicadorDasMusicasCompradas = 11.0;
	}

	public void setPerfilDeMultiplicadores3() {
		this.multiplicadorSexo = 11.2;
		this.multiplicadorIdade = 11.4;
		this.multiplicadorDeHorasDeMusicaPorSemana = 12.4;
		this.multiplicadorDeRenda = 17.5;
		this.multiplicadorDasMusicasCompradas = 12.1;
	}

	public void setPerfilDeMultiplicadores4() {
		this.multiplicadorSexo = 11.2;
		this.multiplicadorIdade = 15.4;
		this.multiplicadorDeHorasDeMusicaPorSemana = 16.4;
		this.multiplicadorDeRenda = 13.5;
		this.multiplicadorDasMusicasCompradas = 13.1;
	}

	public void setPerfilDeMultiplicadores5() {
		this.multiplicadorSexo = 19.2;
		this.multiplicadorIdade = 19.5;
		this.multiplicadorDeHorasDeMusicaPorSemana = 19.4;
		this.multiplicadorDeRenda = 19.7;
		this.multiplicadorDasMusicasCompradas = 19.8;
	}

	public ArrayList<TipoKNN> KNN(Cliente clienteNovo,
			HashMap<String, Cliente> ClientesDaRadio) {
		double sexoKNN, idadeKNN, horasDeMusicaPorSemanaKNN, rendaKNN, musicasCompradasKNN;
		ArrayList<TipoKNN> distancias = new ArrayList<>();
		ArrayList<TipoKNN> kVizinhosProximos = new ArrayList<>(); 
		DecimalFormat deci = new DecimalFormat("0.000");
		Set<String> keys = ClientesDaRadio.keySet();
		for (String i : keys) {
			TipoKNN distanciaTemporaria = new TipoKNN();
			sexoKNN = Math.pow(
					(((double) clienteNovo.getSexo() - (double) ClientesDaRadio
							.get(i).getSexo()) / 2.0), 2.0);

			idadeKNN = Math
					.pow(((double) (clienteNovo.getIdade() - (double) ClientesDaRadio
							.get(i).getIdade()) / 60.0), 2.0);

			horasDeMusicaPorSemanaKNN = Math
					.pow((((double) clienteNovo.getHorasDeMusicaPorSemana() - (double) ClientesDaRadio
							.get(i).getQuantidadeDeMusicasCompradas()) / 50.0),
							2.0);

			rendaKNN = Math.pow(
					((clienteNovo.getRendaMensal() - ClientesDaRadio.get(i)
							.getRendaMensal()) / 6000.0), 2);

			musicasCompradasKNN = Math
					.pow((((double) clienteNovo
							.getQuantidadeDeMusicasCompradas() - (double) ClientesDaRadio
							.get(i).getQuantidadeDeMusicasCompradas()) / 25.0),
							2.0);
			/*System.out.print((multiplicadorSexo * sexoKNN) + "\t");
			System.out.print((multiplicadorIdade * idadeKNN) + "\t");
			System.out
					.print((multiplicadorDeHorasDeMusicaPorSemana * horasDeMusicaPorSemanaKNN)
							+ "\t");
			System.out.print((multiplicadorDeRenda * rendaKNN) + "\t");
			System.out
					.print((multiplicadorDasMusicasCompradas * musicasCompradasKNN)
							+ "\t");*/
			distanciaTemporaria
					.setDistanciaTipoKNN((Math
							.sqrt((multiplicadorSexo * sexoKNN)
									+ (multiplicadorIdade * idadeKNN)
									+ (multiplicadorDeHorasDeMusicaPorSemana * horasDeMusicaPorSemanaKNN)
									+ (multiplicadorDeRenda * rendaKNN)
									+ (multiplicadorDasMusicasCompradas * musicasCompradasKNN))));
			distanciaTemporaria.setClienteTipoKNN(ClientesDaRadio.get(i));
			distancias.add(distanciaTemporaria);
			//System.out.println(distanciaTemporaria.getDistanciaTipoKNN().doubleValue());
		}
		Collections.sort(distancias);
		/*for (TipoKNN d : distancias) {
			//System.out.print(deci.format((d.getDistanciaTipoKNN().doubleValue())));
			//System.out.println(" " + d.getClienteTipoKNN());
			
		}*/
		for(int i = 0;i<this.K;i++){
			kVizinhosProximos.add(distancias.get(i));
		}
		return kVizinhosProximos;
	}
}
